Java Netty 传输工具 ByteBuf
为什么需要 ByteBuf?
之前学习 NIO 的时候它使用了 ByteBuffer 来传输数据,那为什么 Netty 还要创建一个 ByteBuf 来传输数据呢?
主要是修复了一些 ByteBuffer 使用的痛点,下面是一些 ByteBuf API 的优点:
- 它可以被用户自定义的缓冲区类型扩展
- 通过内置的复合缓冲区类型实现了透明的零拷贝
- 容量可以按需增长(类似于 JDK 的 StringBuilder)
- 在读和写这两种模式之间切换不需要调用 ByteBuffer 的
flip()
方法 - 读和写使用了不同的索引
- 支持方法的链式调用
- 支持引用计数
- 支持池化
ByteBuf 切片
ByteBuf 切片是【零拷贝】的体现之一,对原始 ByteBuf 进行切片成多个 ByteBuf,切片后的 ByteBuf 并没有发生内存复制,还是使用原始 ByteBuf 的内存,切片后的 ByteBuf 维护独立的 read,write 指针
得到分片后的 buffer 后,要调用其 retain 方法,使其内部的引用计数加一。避免原 ByteBuf 释放,导致切片 buffer 无法使用
修改原 ByteBuf 中的值,也会影响切片后得到的 ByteBuf